//
//  DMConfigReader.h
//  DualMediationSDK
//
//  Created by YeJary on 2025/1/27.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

#pragma mark - 广告配置模型

/**
 * 广告单元配置模型
 */
@interface DMAdUnitConfig : NSObject
@property (nonatomic, strong) NSString *ad_type;        // 广告类型 (IS/MAX)
@property (nonatomic, strong) NSString *ad_unitID;      // 广告单元ID
@property (nonatomic, assign) BOOL is_low;              // 是否为低价广告
@end

/**
 * TA配置模型
 */
@interface DMTAConfig : NSObject
@property (nonatomic, strong) NSString *server_url;     // 服务器URL
@property (nonatomic, strong) NSString *app_id;         // 应用ID
@end

/**
 * Adjust配置模型
 */
@interface DMAdjustConfig : NSObject
@property (nonatomic, strong) NSString *app_token;              // 应用Token
@property (nonatomic, strong) NSString *sdk_iap_revenue_token;  // IAP收入Token
@end

/**
 * Facebook配置模型
 */
@interface DMFBConfig : NSObject
@property (nonatomic, strong) NSString *facebook_AppId;         // Facebook应用ID
@property (nonatomic, strong) NSString *facebook_client_token;  // Facebook客户端Token
@end

/**
 * Odeeo配置模型
 */
@interface DMOdeeoConfig : NSObject
@property (nonatomic, strong) NSString *app_id;                             // 应用ID
@property (nonatomic, strong) NSString *audio_icon_placement_id;            // 音频图标位置ID
@property (nonatomic, strong) NSString *audio_banner_placement_id;          // 音频横幅位置ID
@property (nonatomic, strong) NSString *audio_rewarded_icon_placement_id;   // 音频激励图标位置ID
@property (nonatomic, strong) NSString *audio_rewarded_banner_placement_id; // 音频激励横幅位置ID
@end

/**
 * 广告配置模型（配置文件专用）
 */
@interface DMConfigAdConfig : NSObject
@property (nonatomic, strong) NSString *default_sdk_type;           // 默认SDK类型
@property (nonatomic, strong) NSArray<DMAdUnitConfig *> *BannerIds; // 横幅广告配置
@property (nonatomic, strong) NSArray<DMAdUnitConfig *> *InterIds;  // 插屏广告配置
@property (nonatomic, strong) NSArray<DMAdUnitConfig *> *SplashIds; // 开屏广告配置
@property (nonatomic, strong) NSArray<DMAdUnitConfig *> *RewardIds; // 激励广告配置
@property (nonatomic, strong) NSArray<DMAdUnitConfig *> *NativeIds; // 原生广告配置
@property (nonatomic, strong) DMOdeeoConfig *odeeoConfig;           // Odeeo配置
@property (nonatomic, strong) NSString *IS_AppKey;                  // IronSource应用Key
@property (nonatomic, strong) NSString *GADApplicationIdentifier;   // Google广告应用标识符
@property (nonatomic, strong) NSString *Max_AppKey;                 // MAX应用Key
@property (nonatomic, strong) NSString *max_review_api_key;         // MAX审核API Key
@end

/**
 * IAP产品配置模型
 */
@interface DMIAPProductConfig : NSObject
@property (nonatomic, strong) NSString *productId;     // 产品ID
@property (nonatomic, strong) NSString *dollar_price;  // 美元价格
@end

/**
 * IAP配置模型
 */
@interface DMIAPConfig : NSObject
@property (nonatomic, strong) NSArray<DMIAPProductConfig *> *consumableIds;    // 消耗品ID列表
@property (nonatomic, strong) NSArray<DMIAPProductConfig *> *nonConsumableIds; // 非消耗品ID列表
@property (nonatomic, strong) NSArray<DMIAPProductConfig *> *subscribeIds;     // 订阅ID列表
@end

#pragma mark - 配置读取器

/**
 * SDK配置读取器
 * 用于读取和解析sdk_config_mediation.json文件中的配置参数
 */
@interface DMConfigReader : NSObject

#pragma mark - 单例

/**
 * 获取单例实例
 * @return 配置读取器实例
 */
+ (instancetype)sharedInstance;

#pragma mark - 配置加载

/**
 * 从默认路径加载配置文件
 * @return 是否加载成功
 */
- (BOOL)loadConfig;

/**
 * 从指定路径加载配置文件
 * @param filePath 配置文件路径
 * @return 是否加载成功
 */
- (BOOL)loadConfigFromPath:(NSString *)filePath;

/**
 * 从Bundle中加载配置文件
 * @param fileName 文件名（不含扩展名）
 * @return 是否加载成功
 */
- (BOOL)loadConfigFromBundle:(NSString *)fileName;

/**
 * 重新加载配置
 * @return 是否重新加载成功
 */
- (BOOL)reloadConfig;

#pragma mark - 基础配置获取

/**
 * 获取sdk版本号
 * @return sdk版本号
 */
- (nullable NSString *)sdkVersion;

/**
 * 获取应用名称
 * @return 应用名称
 */
- (nullable NSString *)appName;

/**
 * 获取包名
 * @return 包名
 */
- (nullable NSString *)packageName;

/**
 * 获取SDK应用ID
 * @return SDK应用ID
 */
- (nullable NSString *)sdkAppId;


/**
 * 获取AppStore ID
 * @return AppStore ID
 */
- (nullable NSString *)appstoreId;

/**
 * 获取当前应用版本号（CFBundleShortVersionString）
 * @return 应用版本号，如 1.2.3
 */
- (nullable NSString *)appVersion;

#pragma mark - 第三方服务配置

/**
 * 获取TA配置
 * @return TA配置对象
 */
- (nullable DMTAConfig *)taConfig;

/**
 * 获取Adjust配置
 * @return Adjust配置对象
 */
- (nullable DMAdjustConfig *)adjustConfig;

/**
 * 获取Facebook配置
 * @return Facebook配置对象
 */
- (nullable DMFBConfig *)fbConfig;

#pragma mark - 广告配置获取

//MAX广告唯一标识符号
+(NSString *)auctionId;

/**
 * 获取广告配置
 * @return 广告配置对象
 */
- (nullable DMConfigAdConfig *)adConfig;

/**
 * 获取默认SDK类型
 * @return 默认SDK类型
 */
- (nullable NSString *)defaultSDKType;

/**
 * 获取横幅广告配置列表
 * @return 横幅广告配置数组
 */
- (nullable NSArray<DMAdUnitConfig *> *)bannerAdConfigs;

/**
 * 获取插屏广告配置列表
 * @return 插屏广告配置数组
 */
- (nullable NSArray<DMAdUnitConfig *> *)interstitialAdConfigs;

/**
 * 获取开屏广告配置列表
 * @return 开屏广告配置数组
 */
- (nullable NSArray<DMAdUnitConfig *> *)splashAdConfigs;

/**
 * 获取激励广告配置列表
 * @return 激励广告配置数组
 */
- (nullable NSArray<DMAdUnitConfig *> *)rewardedAdConfigs;

/**
 * 获取原生广告配置列表
 * @return 原生广告配置数组
 */
- (nullable NSArray<DMAdUnitConfig *> *)nativeAdConfigs;

/**
 * 根据广告类型获取对应的广告单元配置
 * @param adType 广告类型（Banner/Inter/Splash/Reward/Native）
 * @param sdkType SDK类型（IS/MAX）
 * @param isLow 是否为低价广告
 * @return 广告单元配置，未找到返回nil
 */
- (nullable DMAdUnitConfig *)adUnitConfigForType:(NSString *)adType sdkType:(NSString *)sdkType isLow:(BOOL)isLow;

#pragma mark - SDK Key获取

/**
 * 获取IronSource应用Key
 * @return IronSource应用Key
 */
- (nullable NSString *)ironSourceAppKey;

/**
 * 获取Google广告应用标识符
 * @return Google广告应用标识符
 */
- (nullable NSString *)googleAdApplicationIdentifier;

/**
 * 获取MAX应用Key
 * @return MAX应用Key
 */
- (nullable NSString *)maxAppKey;

/**
 * 获取MAX审核API Key
 * @return MAX审核API Key
 */
- (nullable NSString *)maxReviewApiKey;

#pragma mark - IAP配置获取

/**
 * 获取IAP配置
 * @return IAP配置对象
 */
- (nullable DMIAPConfig *)iapConfig;

/**
 * 获取消耗品配置列表
 * @return 消耗品配置数组
 */
- (nullable NSArray<DMIAPProductConfig *> *)consumableProducts;

/**
 * 获取非消耗品配置列表
 * @return 非消耗品配置数组
 */
- (nullable NSArray<DMIAPProductConfig *> *)nonConsumableProducts;

/**
 * 获取订阅产品配置列表
 * @return 订阅产品配置数组
 */
- (nullable NSArray<DMIAPProductConfig *> *)subscriptionProducts;

/**
 * 根据产品ID获取产品配置
 * @param productId 产品ID
 * @return 产品配置，未找到返回nil
 */
- (nullable DMIAPProductConfig *)productConfigForId:(NSString *)productId;

/**
 * 获取全部IAP商品的产品ID（包含消耗品、非消耗品与订阅）
 * @return 产品ID数组（可能为空，按配置顺序且去重）
 */
- (nullable NSArray<NSString *> *)allIAPProductIds;

#pragma mark - 配置状态

/**
 * 检查配置是否已加载
 * @return 是否已加载配置
 */
- (BOOL)isConfigLoaded;

/**
 * 获取配置文件路径
 * @return 当前使用的配置文件路径
 */
- (nullable NSString *)configFilePath;

/**
 * 获取配置加载时间
 * @return 配置加载时间
 */
- (nullable NSDate *)configLoadTime;

/**
 * 验证配置完整性
 * @return 配置是否完整有效
 */
- (BOOL)validateConfig;


// SDK配置文件方法
+ (NSString *)primaryRewardForSDKConfigFile;
+ (NSString *)secondaryRewardForSDKConfigFile;
+ (NSString *)primaryInterForSDKConfigFile;
+ (NSString *)secondaryInterForSDKConfigFile;
+ (NSString *)primaryBannerForSDKConfigFile;
+ (NSString *)secondaryBannerForSDKConfigFile;

// MAX SDK配置文件方法
+ (NSString *)primaryRewardForSDKConfigFileMAX;
+ (NSString *)secondaryRewardForSDKConfigFileMAX;
+ (NSString *)primaryInterForSDKConfigFileMAX;
+ (NSString *)secondaryInterForSDKConfigFileMAX;
+ (NSString *)primaryBannerForSDKConfigFileMAX;
+ (NSString *)secondaryBannerForSDKConfigFileMAX;

// 双广告位支持 - 主广告位ID
+ (NSString *)primaryRewardAdUnitId;
+ (NSString *)primaryInterAdUnitId;
+ (NSString *)primaryBannerAdUnitId;

// 双广告位支持 - 备用广告位ID
+ (NSString *)secondaryRewardAdUnitId;
+ (NSString *)secondaryInterAdUnitId;
+ (NSString *)secondaryBannerAdUnitId;

// MAX双广告位支持 - 主广告位ID
+ (NSString *)primaryRewardAdUnitIdForMAX;
+ (NSString *)primaryInterAdUnitIdForMAX;
+ (NSString *)primaryBannerAdUnitIdForMAX;

// MAX双广告位支持 - 备用广告位ID
+ (NSString *)secondaryRewardAdUnitIdForMAX;
+ (NSString *)secondaryInterAdUnitIdForMAX;
+ (NSString *)secondaryBannerAdUnitIdForMAX;

// 双广告位配置检查
+ (BOOL)hasDualAdConfiguration;
+ (BOOL)hasDualRewardAdConfiguration;
+ (BOOL)hasDualInterAdConfiguration;
+ (BOOL)hasDualBannerAdConfiguration;

// MAX双广告位配置检查
+ (BOOL)hasDualAdConfigurationForMAX;
+ (BOOL)hasDualRewardAdConfigurationForMAX;
+ (BOOL)hasDualInterAdConfigurationForMAX;
+ (BOOL)hasDualBannerAdConfigurationForMAX;

+ (BOOL)isDualAdConfigEnabled;

@end

NS_ASSUME_NONNULL_END
